Ethereum の function call データフォーマット
マルチシグウォレットを使用して他のスマートコントラクトのメソッドを実行したりするのに必要なので調べたよ
Solidity で書かれたスマートコントラクトに次のようなメソッドがある場合で説明します 以下の countUp() とか countDown() を、マルチシグウォレットから実行するためにはどういったトランザクションを作って送ればいいか、という話
code:example.js
pragma solidity ^0.4.19;
contract Count {
uint256 public count;
function countUp() public {
count = count + 1;
}
function countDown() public {
count = count - 1;
}
}
function call のデータについて、最初の4バイトはシグネチャと呼ばれる次のフォーマットにした関数のプロトタイプのようなものを Keccak256 でハッシュ化したものを使うとのこと。
引数は型のみを使用します。
引数の型はカンマで区切ります。
funtionName(type1,type2,...)
上記の countUp() の場合、Node.js で書くとつぎのような感じで、Keccak256 のハッシュが得られるので、最初の 4bytes 0x0bd8599e がトランザクションに含むべきデータになります。 code:example.js
const Web3 = require('web3');
console.log(Web3.version);
// => 1.0.0-beta.34
const signature = 'countUp()';
const hash = Web3.utils.keccak256(signature);
console.log(hash);
// => 0x0bd8599e08d359240ca8194d54975e0eda037fe2109af0514fc9505f2cfc9407
例えば、上記のコントラクトのアドレスが、0xe126016d061369cd23de92475d04fb762b663a97 だとしたら、countUp() を実行したい場合、つぎのようなトランザクションを送る
to: 0xe126016d061369cd23de92475d04fb762b663a97
value: 0
data: 0x0bd8599e
実際にためしてみたtx
引数をとる場合については時間がなくなってしまったのでまた今度書きます。
今回はいつにもまして乱文になってしまった..